package br.com.uglyboys.control;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

import android.content.Context;
import br.com.uglyboys.constantes.Constantes;
import br.com.uglyboys.model.Informacao;
import br.com.uglyboys.model.ObjetoRastreavel;
import br.com.uglyboys.persistence.Persistencia;

public class CorreioController {
	private static CorreioController instancia;
	private Persistencia persistencia;
	private static Context context;
	private ObjetoRastreavel objetoRastreavel;
	private CorreioController(Context ctx) {
		persistencia = new Persistencia(ctx);
	}
	
	public ObjetoRastreavel getObjetoRastreavel() {
		return objetoRastreavel;
	}

	public void setObjetoRastreavel(ObjetoRastreavel objetoRastreavel) {
		this.objetoRastreavel = objetoRastreavel;
	}

	public static CorreioController getInstancia(Context ctx){
		if(instancia == null){
			context = ctx;
			instancia = new CorreioController(ctx);
		}
		return instancia;
	}
	
	public static CorreioController getInstancia(){
		if(instancia == null){
			instancia = new CorreioController(context);
		}
		return instancia;
	}
	
	public List<ObjetoRastreavel> getOjbetosRastreaveis(){
		return persistencia.getObjetosRastreaveis();
	}


	public ObjetoRastreavel getInformacoes(ObjetoRastreavel objetoRastreavel) {
		ObjetoRastreavel objRastreavel = null;
		try {
		HttpClient httpClient = new DefaultHttpClient();
		HttpContext localContext = new BasicHttpContext();
		HttpGet httpGet = new HttpGet(Constantes.SITE_CORREIOS + objetoRastreavel.getCodigo());
		HttpResponse response;
			response = httpClient.execute(httpGet, localContext);
		String result = "";
		 
		BufferedReader reader = new BufferedReader(
		    new InputStreamReader(
		      response.getEntity().getContent()
		    )
		  );
		 
		String line = null;
		while ((line = reader.readLine()) != null){
		  result += line + "\n";
		}
		
		objRastreavel = tratamentoHTML(objetoRastreavel, result);
		
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return objRastreavel;

	}

	private ObjetoRastreavel tratamentoHTML(ObjetoRastreavel objetoRastreavel, String result) {
		String[] table = result.split("table");
		String[] linhas = table[1].split("<tr>");
		List<Informacao> informacoes = new ArrayList<Informacao>();
		Informacao informacao = null;
		for (String string : linhas) {
			if(string.contains("<td rowspan=") || string.contains("<td colspan=")){
				if(string.contains("<td rowspan=")){
					if(informacao == null){
						informacao = new Informacao();
					}else{
						informacoes.add(informacao);
						informacao = new Informacao();
					}
					informacao.setData(string.substring(14, 24));
					String[] localSituacao = string.split("</td><td>");
					informacao.setLocal(localSituacao[1]);
					informacao.setSituacao(localSituacao[2].split("<FONT COLOR=")[1].split(">")[1].split("</font")[0]);
				}else if(string.contains("<td colspan=")){
					informacao.setLocal(informacao.getLocal() + "\n" + string.split("<td colspan=2>")[1].split("</td></tr>")[0]);
				}
			}
		}
		
		if(!informacoes.contains(informacao)){
			informacoes.add(informacao);
		}
		verificaNovaInformacao(objetoRastreavel, informacoes);
		return objetoRastreavel;
	}
	
	public boolean verificaNovaInformacao(ObjetoRastreavel objetoRastreavel, List<Informacao> informacoes){
		List<Informacao> infoObjeto = objetoRastreavel.getInformacoes();
		Informacao novaInformacao = null;
		if(infoObjeto != null && informacoes != null){
			if(infoObjeto.size() != informacoes.size()){
				for (Informacao informacaoReal : informacoes) {
					boolean achou = false;
					for (Informacao informacaoObj : infoObjeto) {
						if(informacaoObj.getSituacao().equals(informacaoReal.getSituacao())){
							achou = true;
						}
					}
					if(!achou){
						novaInformacao = informacaoReal;
					}
				}
				if(novaInformacao != null){
					objetoRastreavel.addInformacao(novaInformacao);
					atualizar(objetoRastreavel);
					return true;
				}else{
					return false;
				}
			}
		}
		return false;
	}
	

//	public boolean verificaNovaInformacao(ObjetoRastreavel objetoRastreavel, List<Informacao> informacoes){
//		List<Informacao> infoObjeto = objetoRastreavel.getInformacoes();
//		if(infoObjeto != null && informacoes != null){
//			if(infoObjeto.size() != informacoes.size()){
//				for (Informacao informacaoReal : informacoes) {
//					boolean achou = false;
//					for (Informacao informacaoObj : infoObjeto) {
//						if(informacaoObj.getSituacao().equals(informacaoReal.getSituacao())){
//							achou = true;
//						}
//					}
//					if(!achou){
//						objetoRastreavel.addInformacao(informacaoReal);
//					}
//				}
//				atualizar(objetoRastreavel);
//				return true;
//			}
//		}
//		return false;
//	}

	public void salvarObjetoRastreavel(ObjetoRastreavel objetoRastreavel) {
		persistencia.salvarObjetoRastreavel(getInformacoes(objetoRastreavel));
		
	}

	public void remover(ObjetoRastreavel objetoRastreavel) {
		persistencia.removerObjetoRastreavel(objetoRastreavel);
	}

	public void atualizar(ObjetoRastreavel objetoRastreavel) {
		persistencia.atualizarObjetoRastreavel(objetoRastreavel);
	}


}
